package com.example.demo.bean;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import net.minidev.json.annotate.JsonIgnore;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.util.Set;

/**
 * @Author:linchong
 * @CreateTime:2020-03-30 11:25
 * @Description:分类
 *
 * 1.实体上面注解 @NamedEntityGraph, 指明 name 供查询方法使用, attributeNodes 指明被标注为懒加载的属性节点
 *
 */
/**
 *
 * 典型的 多层级 分类
 * <p>
 * :@NamedEntityGraph : 注解在实体上 , 解决典型的 N+1 问题
 * name 表示实体图名, 与 repository 中的注解 @EntityGraph 的 value 属性相对应,
 * attributeNodes 表示被标注要懒加载的属性节点 比如此例中 : 要懒加载的子分类集合 children
 */
@Entity
@Getter
@Setter
@Table(name = "category")
@NamedEntityGraph(name = "Category.Graph", attributeNodes = {@NamedAttributeNode("children")})
public class Category {

	/**
	 * Id 使用 UUID 生成策略
	 */
	@Id
	@GeneratedValue(generator = "UUID")
	@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
	private String id;
	/**
	 * 分类名
	 */
	private String name;
	/**
	 * 一个商品分类下面可能有多个商品子分类 (多级) 比如 分类 : 家用电器 (子) 分类 : 电脑 (孙)子分类 : 笔记本电脑
	 * 父级类
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "parent_id")
	@JsonIgnore
	private Category parent;
	@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)

	/**
	 * 子分类集合
	 */
	private Set<Category> children;



}
